#include <bits/stdc++.h>
using namespace std;
int n, m;
int A[55];
int C[55];
int lowbit(int a)
{
	return a & -a;
}
int main()
{
	//树状数组与线段树的区别在于
	//1.它不是二叉树
	//2.它只有一部分节点的值等于原数组
	//3.树状数组的长度等于原数组
	//4.它的构造方式,也是最难理解的一部分
	//它的构造方式要用到二进制
	//首先我们明确这样一件事
	//区间和1-4=区间和1-2+区间和3-4
	//在二进制中也是如此
	//区间和1-111=区间和1-100+区间和101-110+区间和111-111
	//发现了吗?
	//每个区间的右端点的变化是有规律的
	//111
	//110
	//100
	//1的个数在逐渐变少,且是从最后一位按顺序不断向前的
	//而这些区间在树状数组中所对应的值分别是
	//1-100->C[100](二进制)
	//101-110->C[110](二进制)
	//111-111->C[111](二进制)
	//利用这个规律,我们就可以建立一个线段树了.
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= n; i++)
		scanf("%d", &A[i]);
	for (int i = 1; i <= n; i++)
	{
		for (int j = i - lowbit(i) + 1; j <= i; j++) //构造,此处是一个规律,C[i]=A[i-lowbit(i)+1]+A[i-lowbit(i)+2]+.....+A[i]
			C[i] += A[j];
	}
	for (int i = 1; i <= m; i++)
	{
		int opt;
		scanf("%d", &opt);
		if (opt == 1) //单点修改
		{
			int change_num, num;
			scanf("%d %d", &change_num, &num);
			for (int i = change_num; i <= n; i += lowbit(i))
				C[i] += num;
			//以修改A[3]为例
			//修改A[3],会影响C[3],C[4],C[8],C[16],C[32]....
			//它们的二进制分别为
			//(3)10=(11)2
			//(4)10=(100)2
			//(8)10=(1000)2
			//(16)10=(10000)2
			//(32)10=(100000)2
			//我们发现了这样一件事
			//(11)2+lowbit((11)2)=(100)2
			//以此类推
		}
		if (opt == 2) //区间查询
		{
			int l, r;
			scanf("%d %d", &l, &r);
			int res = 0;
			int res2 = 0;
			for (int i = l - 1 /*此处是一个左开右闭区间,左边界的值不在有效区之内,故从l-1开始*/; i > 0; i -= lowbit(i))
				res += C[i];
			//以[1,56]区间为例
			//[1,56]=C[56]+C[48]+C[32]
			//56=111000
			//48=110000
			//32=100000
			//可以看出,这三个数末尾1的位置被不断地消去
			//故用i-lowbit(i)=下个下标
			for (int i = r; i > 0; i -= lowbit(i))
				res2 += C[i];
			printf("%d\n", res2 - res);
		}
	}
	return 0;
}